<template>
  <div class="contarner-page" @click.stop="showLanguageHandel">
    <page-header ref="languageRef"></page-header>
    <main>
      <div class="downloader flex_ccenter" v-if="!success">
        <div class="container">
          <div class="banner-heading flex_ccenter">
            <div class="heading-item">
              <h1 class="title fw700 f-42 c-fff">
                Instagram Reels Video Download
              </h1>
              <h2 class="sub c-fff f-18 fw400">
                Instagram - Reels Video Downloader
              </h2>
            </div>
          </div>
          <div class="form flex_center">
            <div class="input-box flex_between">
              <!-- <input
                    type="text"
                    class="input f-18"
                    v-model="input"
                    @input="handleInput"
                    @paste="handleInput"
                    placeholder="Paste URL Instagram"
                    list="fruits"
                    name="fruit"
                  />
                  <datalist id="fruits">
                    <option value="Apple"></option>
                    <option value="Banana"></option>
                    <option value="Cherry"></option>
                  </datalist> -->
              <input
                type="text"
                class="input f-18"
                v-model="input"
                :disabled="isHttpLoading"
                @input="handleInput"
                @paste="handleInput"
                @keydown="sendDownload($event)"
                placeholder="Paste URL Instagram"
              />
              <div
                class="Paste shou flex_center"
                @click="handleClickPasted"
                v-if="input == ''"
              >
                <div class="btnbg"></div>
                <div class="f-16 c-000 fw700">Paste</div>
              </div>
              <div
                class="clear shou flex_center"
                v-if="input != '' && !isHttpLoading"
                @click.stop="input = ''"
              >
                <div class="btnbg"></div>
                <div class="f-16 c-000 fw700">Clear</div>
              </div>
            </div>
            <div
              v-if="!isHttpLoading"
              @click.stop="downloadHandel"
              class="submit shou fw700 c-fff flex_center"
            >
              Download
            </div>
            <div v-else class="submit shou fw700 c-fff flex_center">
              Please wait
            </div>
          </div>
          <div class="app-submit flex_ccenter">
            <div
              class="submit flex_center"
              v-if="!isHttpLoading"
              @click.stop="downloadHandel"
            >
              <div class="fw700 c-fff f-21">Download</div>
            </div>
            <div class="submit flex_center" v-else>
              <div class="fw700 c-fff f-21">Please wait</div>
            </div>
          </div>
          <div class="loading" v-if="isHttpLoading">
            <div class="loading-dots flex_center">
              <div class="dot"></div>
              <div class="dot"></div>
              <div class="dot"></div>
              <div class="dot"></div>
            </div>
            <div class="tips f-18 flex_center">
              <div>Retrieving data, please wait a few seconds!</div>
            </div>
          </div>
          <div class="error flex_ccenter" v-if="httpError1">
            <div class="hono flex_">
              <div class="error-img"></div>
              <div class="error-img"></div>
              <div class="error-img"></div>
            </div>
            <div class="errMsg f-18">
              The site can not process your link because it is private
            </div>
          </div>
          <div class="error flex_ccenter" v-if="httpError2">
            <div class="hono flex_">
              <div class="error-img"></div>
              <div class="error-img"></div>
              <div class="error-img"></div>
            </div>
            <div class="errMsg f-18">
              The data you entered is not a link, please enter a valid link for
              example:
              <div>https://www.instagram.com/reel/Cml9qu-ISqx</div>
            </div>
          </div>
        </div>
      </div>
      <!-- 广告位start -->
      <!-- 广告位end -->
      <div class="container" v-if="!success">
        <div class="body-content">
          <div class="app-box">
            <div class="app-box__info">
              <h3 class="app-box__title f-21 fw700 c-000">
                Download with app Insta Downloader
              </h3>
              <p class="f-16 c-ccc">
                Our app offers a quick and simple solution for downloading Instagram videos, providing HD quality videos without watermarks.
              </p>
            </div>
            <div class="app-link">
              <a 
                  target="_blank" href="https://play.google.com/store/apps/details?id=ins.freevideodownload.pro">
                <img src="/static/images/google-play.webp" alt="Download app " />
              </a>
              <a href="https://apps.apple.com/us/app/repost-for-video-save-story/id6462401460"  target="_blank">
                <img src="/static/images/IOS.webp" alt="Download app " />
              </a>
            </div>
          </div>
          <div class="quick-info">
            <h3 class="f-32 c-000">What do Reels on Instagram mean?</h3>
            <p class="f-16 c-ccc">
              With two possibilities for length—15 or 30 seconds—Instagram Reels
              is a new feature that lets you make short films. Reels combines
              Instagram's amazing editing features with some Tiktok-like
              features, yet it's still exciting when users utilize it. Users can
              make original movies by editing and designing captivating videos.
            </p>
          </div>
          <div class="features c-fff">
            <h3 class="h3 fw700 f-21">
              Features of Instagram Reels downloader
            </h3>
            <div class="attributes-list flex_between">
              <div class="item flex_">
                <div class="bgimg"></div>
                <div class="f-14 c-fff">
                  A quick, simple, and secure way to download Instagram Reels.
                </div>
              </div>
              <div class="item flex_">
                <div class="bgimg"></div>
                <div class="f-14 c-fff">
                  You can access your Instagram account without logging in.
                </div>
              </div>
              <div class="item flex_">
                <div class="bgimg"></div>
                <div class="f-14 c-fff">
                  Simply clicking on a button on Instagram allows you to
                  download its photographs and videos.
                </div>
              </div>
              <div class="item flex_">
                <div class="bgimg"></div>
                <div class="f-14 c-fff">
                  Download and save images and videos with their original
                  quality and resolution.
                </div>
              </div>
              <div class="item flex_">
                <div class="bgimg"></div>
                <div class="f-14 c-fff">
                  From personal accounts, download and save Instagram Reels.
                </div>
              </div>
            </div>
          </div>
          <div class="how">
            <div class="how-title">
              <h3 class="f-36 c-000 italic">
                Is it possible to use Savinginsta to download videos from
                Instagram Reels?
              </h3>
            </div>
            <div class="steps">
              <div class="step">
                <div class="one">
                  <span class="fw700 c-blue f-16">Step01:</span>
                  <span class="f-16 c-000">
                    navigate to the Instagram post that you wish to download,
                    then select the Reels video.</span
                  >
                </div>
              </div>
              <div class="step">
                <span class="fw700 c-blue f-16">Step02:</span>
                <span class="f-16 c-000">
                  Currently, copy the Instagram Reels video's URL.</span
                >
              </div>
              <div class="step">
                <span class="fw700 c-blue f-16">Step03:</span>
                <span class="f-16 c-000"
                  >Copy the URL from Instagram, paste it into Savinginsta's
                  toolbar, and press "Download".</span
                >
              </div>
            </div>
            <div class="user-note f-16">
              <div class="app-tip"></div>
              <p>
                Your own account-uploaded films and photos can be downloaded
                with the aid of our tools. If you use our tools to violate
                others' intellectual property or privacy, we retain the right to
                refuse to provide our service.
              </p>

              <a class="fw700 c-blue" href="/terms-of-service"
                >Click here to view our complete Terms of Service.</a
              >
            </div>
          </div>
          <div class="faq-section">
            <h3 class="faq-title f-36 c-000 italic">FAQ</h3>
            <div class="accordion">
              <div
                id="faq"
                itemscope="itemscope"
                itemtype="https://schema.org/FAQPage"
              >
                <div
                  itemprop="mainEntity"
                  itemscope="itemscope"
                  itemtype="https://schema.org/Question"
                  class="accordion-item"
                  :key="k"
                  v-for="(item, k) in faqList"
                >
                  <h4 itemprop="name" class="accordion-title fw700 f-16">
                    {{ item.title }}
                  </h4>
                  <div
                    itemprop="acceptedAnswer"
                    itemscope=""
                    itemtype="https://schema.org/Answer"
                  >
                    <div
                      itemprop="text"
                      class="accordion-text f-16 c-ccc fw400"
                    >
                      {{ item.content }}
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <!-- 解析结果 start -->
      <div class="container" v-if="success">
        <success-content
          @refresh="refresh"
          :list="successList"
        ></success-content>
      </div>
      <!-- 解析结果 end -->
    </main>
    <footer>
      <div class="container">
        <div class="footer-content">
          <div class="footer-link">
            <div class="row flex_between">
              <div class="col-12">
                <div class="link-label fw700 c-000 f-21">Tools</div>
                <ul class="list-unstyled c-ccc f-16">
                  <li>
                    <nuxt-link to="/instagram-story-download" 
                      >Instagram Story Downloader</nuxt-link
                    >
                  </li>
                  <li>
                    <nuxt-link to="/instagram-reels-video-download" 
                      >Instagram Reels Downloader</nuxt-link
                    >
                  </li>
                  <li>
                    <a href="https://savingtik.com/" target="_blank"
                      >Tiktok Downloader</a
                    >
                  </li>
                </ul>
              </div>
              <div class="col-6">
                <div class="link-label fw700 c-000 f-21">Support</div>
                <ul class="list-unstyled c-ccc f-16">
                  <li>
                    <nuxt-link to="/contact"> Contact </nuxt-link>
                  </li>
                  <li>
                    <nuxt-link to="/blog"> Blog </nuxt-link>
                  </li>
                </ul>
              </div>
              <div class="col-6">
                <div class="link-label fw700 c-000 f-21">Legal</div>
                <ul class="list-unstyled c-ccc f-16">
                  <li>
                    <nuxt-link to="/terms-of-service">
                      Terms of Service
                    </nuxt-link>
                  </li>
                  <li>
                    <nuxt-link to="/privacy-policy"> Privacy Policy </nuxt-link>
                  </li>
                </ul>
              </div>
            </div>
          </div>
          <div class="copyright flex_ccenter">
            <b class="fw700 f-21 c-000"
              >We are not affiliated with Instagram or Meta</b
            >
            <div class="c-ccc f-16">
                © {{new Date().getFullYear()}} Insta Downloader All rights reserved.
            </div>
          </div>
        </div>
      </div>
    </footer>
  </div>
</template>
    
<script>
import { mapState, mapGetters, mapMutations } from "vuex";
import pageHeader from "~/components/page-header.vue";
import SuccessContent from "~/components/success-content.vue";
import CryptoJS from "crypto-js";
import { handleClick, checkString } from "@/plugins/Firebase.js";
export default {
  components: { pageHeader, SuccessContent },
  head: {
    htmlAttrs: {
      lang: "en",
    },
    bodyAttrs: {
      "data-lang": "en",
    },
    title: "Instagram Reels Video Download - Savinginsta",
    meta: [
      { property: "og:locale", content: "en" },
      //Page Information
      {
        name: "description",
        content:
          "With Savinginsta Reels Video Downloader, downloading Instagram Reels is a breeze! Experience fast, free, and high-quality video downloads directly to your device",
      },

      //Schema.org Microdata
      {
        itemprop: "name",
        content: "Instagram Reels Video Download - Savinginsta",
      },

      // Facebook / OpenGraph
      {
        property: "og:title",
        content: "Instagram Reels Video Download - Savinginsta",
      },
      { property: "og:type", content: "website" },
      { property: "og:url", content: "https://savinginsta.com/instagram-reels-video-download" },

      {
        property: "og:description",
        content:
          "With Savinginsta Reels Video Downloader, downloading Instagram Reels is a breeze! Experience fast, free, and high-quality video downloads directly to your device",
      },
      //Twitter
      { name: "twitter:card", content: "summary" },
      { name: "twitter:url", content: "https://savinginsta.com/instagram-reels-video-download" },
      {
        name: "twitter:title",
        content: "Instagram Reels Video Download - Savinginsta",
      },
      {
        name: "twitter:description",
        content:
          "With Savinginsta Reels Video Downloader, downloading Instagram Reels is a breeze! Experience fast, free, and high-quality video downloads directly to your device",
      },
      //multilingual
      {
        name: "google",
        content: "notranslate",
      },
    ],
    link: [
      //multilingual
      {
        rel: "alternate",
        hreflang: "x-default",
        href: "https://savinginsta.com/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "en",
        href: "https://savinginsta.com/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "en-in",
        href: "https://savinginsta.com/in/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "vi",
        href: "https://savinginsta.com/vn/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "tr",
        href: "https://savinginsta.com/tr/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "id",
        href: "https://savinginsta.com/id/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "fr",
        href: "https://savinginsta.com/fr/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "pt",
        href: "https://savinginsta.com/pt/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "ru",
        href: "https://savinginsta.com/ru/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "es",
        href: "https://savinginsta.com/es/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "ms",
        href: "https://savinginsta.com/ms/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "ko",
        href: "https://savinginsta.com/ko/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "ja",
        href: "https://savinginsta.com/ja/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "jv",
        href: "https://savinginsta.com/jv/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "cs",
        href: "https://savinginsta.com/cs/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "de",
        href: "https://savinginsta.com/de/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "it",
        href: "https://savinginsta.com/it/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "pl",
        href: "https://savinginsta.com/pl/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "hu",
        href: "https://savinginsta.com/hu/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "nl",
        href: "https://savinginsta.com/nl/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "ro",
        href: "https://savinginsta.com/ro/instagram-reels-video-download",
      },
      {
        rel: "alternate",
        hreflang: "el",
        href: "https://savinginsta.com/el/instagram-reels-video-download",
      },
      {
        rel: "canonical",
        href: "https://savinginsta.com/instagram-reels-video-download",
      },
    ],
    script: [
      {
        json: {
          "@context": "http://schema.org",
          "@graph": [
            {
              "@type": "WebSite",
              name: "Savinginsta",
              alternateName: "Instagram downloader",
              url: "https://savinginsta.com",
            },
            {
              "@type": "WebPage",
              name: "Instagram Reels Video Download - Savinginsta", //title
              inLanguage: "en", //不同语种
              description:
                "With Savinginsta Reels Video Downloader, downloading Instagram Reels is a breeze! Experience fast, free, and high-quality video downloads directly to your device. ", //元描述
              image: "https://savinginsta.com/static/images/savinginsta_thumbnail.jpg", //绝对路径
              url: "https://savingtinsta.com/instagram-reels-video-download",
            },
          ],
        },
        type: "application/ld+json",
      },
    ],
  },
  data() {
    return {
      input: "",
      success: false,
      isHttpLoading: false,
      httpError1: false,
      httpError2: false,
      current: 0,
      successList: [],
      faqList: [
        {
          title: `Does downloading Reels require a login?`,
          content: `Thankfully, you may log out of your account. Downloading it is simple and safe for you.`,
        },
        {
          title: `Are videos from Instagram Reels unlawful to download?`,
          content: `Videos from Insta Reels can be downloaded. However, you should get in touch with the video's owner if you use it for profit or for any other reason that involves the owner's rights. For copyright-related concerns, Savinginsta is not liable.`,
        },
        {
          title: `Do Instagram Reels videos require payment in order to be downloaded?`,
          content: `Free for all. Advertisements are just inserted for server upkeep and improved product optimization.`,
        },
        {
          title: `Are my downloads of Instagram videos limited?`,
          content: `It is obviously free and available for unrestricted downloads.`,
        },
        {
          title: `What is the location of the Instagram videos that are downloaded?`,
          content: `The download folder is where it is often saved on phones. To view your PC's download history, use Ctrl + J.`,
        },
      ],
    };
  },
  computed: {
    ...mapGetters(["language"]),
  },
  mounted() {
    this.debouncedDownInput = this.debounce(this.downInput, 1000);
  },
  methods: {
    async downloadHandel() {
      if (this.isHttpLoading || this.input === "") return;
      this.isHttpLoading = false;
      this.httpError1 = false;
      this.httpError2 = false;
      this.input = this.input.replace(/^.*\s?https:\/\//, "https://");
      let type = checkString(this.input);
      const insUrlPattern = new RegExp("^http(s|)://.*instagram.com.*/.*$");
      if (!insUrlPattern.test(this.input)) {
        //点击解析下载按钮
        handleClick("action_ins_detect_boinsom", {
          site: "other",
          noislink: this.input,
          from: "reel",
          type: type,
        });
        this.httpError2 = true;
        this.isHttpLoading = false;
        return;
      }
      //点击解析下载按钮
      handleClick("action_ins_detect_boinsom", {
        site: "other",
        from: "reel",
        type: type,
      });
      //开始解析  ins_start_resolve
      handleClick("ins_start_resolve", {
        islink: this.input,
        from: "reel",
        type: type,
      });
      this.isHttpLoading = true;
      try {
        let result = this.uki(this.input);
        const response = await fetch(
          "https://savinginsta.com/api/downloader/analysis",
          {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
              path: result,
            }),
          }
        );
        let encryptedResponse = await response.text();
        let parse = JSON.parse(encryptedResponse);
        if (parse.code != 200) {
          // 解析失败  ins_resolve_fail
          handleClick("ins_resolve_fail", {
            reason: "Failed to fetch",
            islink: this.input,
            from: "reel",
            type: type,
          });
          this.httpError1 = true;
          this.isHttpLoading = false;
          return;
        } else {
          //解析成功  ins_resolve_success
          handleClick("ins_resolve_success", {
            type: type,
            from: "reel",
          });
          let decryptedResponse = await this.eki(parse.data); // 使用你的解密函数
          this.successList = JSON.parse(decryptedResponse);
          this.success = true;
          this.isHttpLoading = false;
        }
      } catch (error) {
        // 解析失败  ins_resolve_fail
        handleClick("ins_resolve_fail", {
          reason: "Failed to fetch",
          islink: this.input,
          from: "reel",
          type: type,
        });
        console.error(error);
        this.httpError1 = true;
        this.isHttpLoading = false;
      }
    },

    uki(input) {
      let CIPHER_ALGORITHM = "DES-CBC";
      let IV_SIZE = 8;
       
      
  try {
        const complexKey = [
          process.env.part1,
          process.env.part2,
          process.env.part3,
          process.env.part4,
          process.env.part5,
          process.env.part6,
          process.env.part7,
          process.env.part8,
        ].join("");
        const keyBytes = CryptoJS.enc.Utf8.parse(complexKey);
        const inputBytes = CryptoJS.enc.Utf8.parse(input);
        const ivBytes = CryptoJS.lib.WordArray.random(IV_SIZE);
        const encrypted = CryptoJS.DES.encrypt(inputBytes, keyBytes, {
          iv: ivBytes,
          mode: CryptoJS.mode.CBC,
          padding: CryptoJS.pad.Pkcs7,
        });
        const ciphertext = ivBytes.concat(encrypted.ciphertext);
        return ciphertext.toString();
      } catch (error) {
        console.error(error);
        return null;
      }
    },
    eki(cipherText) {
      let CIPHER_ALGORITHM = "DES-CBC";
      let IV_SIZE = 8;
       
      const complexKey = [
          process.env.part1,
          process.env.part2,
          process.env.part3,
          process.env.part4,
          process.env.part5,
          process.env.part6,
          process.env.part7,
          process.env.part8,
        ].join("");
      try {
        let keyBytes = CryptoJS.enc.Utf8.parse(
          complexKey.padEnd(CIPHER_ALGORITHM === "DES-CBC" ? 8 : 16)
        );
        let ivBytes = { iv: CryptoJS.enc.Hex.parse(process.env.DES_IV) }; // 如果使用CBC模式，需要一个初始化向量iv，这里是空向量
        let decrypted = CryptoJS.DES.decrypt(
          { ciphertext: CryptoJS.enc.Hex.parse(cipherText) },
          keyBytes,
          ivBytes
        );
        return decrypted.toString(CryptoJS.enc.Utf8);
      } catch (e) {
        console.error(e);
        return null;
      }
    },
    sendDownload(event) {
      if (event.keyCode === 13 && !this.isHttpLoading) {
        this.downloadHandel();
        event.preventDefault();
        return false;
      }
    },
    changeTab(k) {
      this.current = k;
    },
    handleInput(e) {
      this.debouncedDownInput(e);
    },
    debounce(fn, delay) {
      let timer;
      return function () {
        let context = this;
        let args = arguments;
        clearTimeout(timer);
        timer = setTimeout(() => {
          fn.apply(context, args);
        }, delay);
      };
    },
    downInput(e) {
      let type = checkString(e.target.value);
      // 粘贴链接到输入框 action_ins_paste
      handleClick("action_ins_paste", {
        islink: e.target.value,
        from: "reel",
        type: type,
      });
    },
    handleClickPasted() {
      if (!navigator.clipboard) {
        console.log("Clipboard API not available");
        return;
      }
      navigator.clipboard
        .readText()
        .then((text) => {
          this.input = text;
          let type = checkString(text);
          // 粘贴链接到输入框 action_ins_paste
          handleClick("action_ins_paste", {
            islink: text,
            from: "reel",
            type: type,
          });
        })
        .catch((err) => {
          console.error("Failed to read clipboard contents: ", err);
        });
    },
    showLanguageHandel() {
      this.$refs.languageRef.close();
    },
    refresh() {
      this.success = false;
      this.input = "";
      this.successList = [];
    },
  },
};
</script>
<style lang="scss" scoped>
 @import "@/static/style/reels.css";
.loading {
  .loading-dots {
    position: relative;
    z-index: 999;
    margin-top: 70px;
  }

  .dot {
    background-color: #ffffff;
    width: 12px;
    height: 12px;
    border-radius: 50%;
    margin: 0 10px;
    animation: loading-animation 1.5s infinite;
  }

  .dot:nth-child(2) {
    animation-delay: 0.5s;
  }

  .dot:nth-child(3) {
    animation-delay: 0.8s;
  }
  .dot:nth-child(4) {
    animation-delay: 1s;
  }
}
@keyframes loading-animation {
  0%,
  50%,
  80%,
  100% {
    transform: scale(1);
  }
  40% {
    transform: scale(1.5);
  }
}
@media (max-width: 768px) {
  .loading {
    .loading-dots {
      margin-top: 26px !important;
    }
    .dot {
      width: 8px !important;
      height: 8px !important;
    }
  }
}
</style>
    